///资料 https://dart.cn/tutorials/language/streams#error-events

/// 模拟创建指定数量的stream
/// async* 表示函数返回一个异步数据序列
/// "可以使用 yield 或 yield* 语句向该 Stream 提交事件。"(https://dart.cn/articles/libraries/creating-streams#creating-a-stream-from-scratch)
///正常 最简单的形式
Stream<int> countStreamNormal(int to) async* {
  for (int i = 0; i <= to; i++) {
    yield i;
  }
}

/// Stream对异常的处理，throw异常即可。
Stream<int> countStreamWithException(int to) async* {
  for (int i = 0; i <= to; i++) {
    if (i == 4) {
      throw Exception("模拟错误了！！");
    } else {
      yield i;
    }
  }

  yield 2;
}

/// 对stream求和
Future<int> sumStream(Stream<int> streams) async {
  int sum = 0;
  try {
    await for (int item in streams) {
      sum += item;
    }
  } catch (e) {
    print("发生错误，提前返回-1");
    return -1;
  }
  return sum;
}

/// Stream中也有类似Iterable中辅助方法
///
void demoLastWhere () async{
  var numbers = await Stream.fromIterable([-2,4,8,-7]);
  var lastWhere = await numbers.lastWhere((element) => element<=0);
  print(lastWhere);

}
/// 创建Stream的三种方式
/// 1. 转换现有的 Stream。
/// 2. 使用 async* 函数创建 Stream。
/// 3. 使用 StreamController 生成 Stream。
void test() {
  Stream.periodic(Duration(seconds: 1),(x)=>x);
}

/// 入口
void main() async {
  // 55
  print(await sumStream(countStreamNormal(10)));
  print(await sumStream(countStreamWithException(10)));
  demoLastWhere();

}
